const fs = require('fs');
const axios = require('axios');
// 使用正则表达式匹配注释
const RemarkReg = /\/\*[^]*?\*\//g;
// 使用正则表达式解析interface \{[^\{\}]*\}
const InterfaceReg = /export\s+interface\s+(\w+)\s*\{([\s\S]*?)\}/g;

let markdown = '## 配置文件说明\n';

const readFiles = async () => {
    const tsFiles = await fs.promises.readdir('../../interfaces/configs/')
    let index = 0
    for(let tsfile of tsFiles){
        index += 1
        const tsData = await fs.promises.readFile(`../../interfaces/configs/${tsfile}`)
        const remarks = tsData.toString().match(RemarkReg)
        let filterRemarks = []
        // 对注释进行过滤
        remarks.forEach((remark) => {
            if(remark.includes('title') && remark.includes('file')){
                filterRemarks.push(remark)
            }
        })
        if(filterRemarks.length === 0){
            // 未扫描到配置文件
            console.log('未扫描到注释，文件生成失败！');
            return;
        }else if(filterRemarks.length === 1){
            // 只有一个版本的配置文件
            const {file,desc,title,version} = analysisRemark(filterRemarks[0])
            // 写入Markdown文件
            markdown += `### ${index}. ${file}(${title}) \n`;
            // 描述不是必填项
            if(desc){
                markdown += `<font color="#808080">${desc}</font> \n`;
            }
            markdown +=  '```' + 'TypeScript\n' + tsData + '\n``` \n';  
            
            // 判断是否携带版本号
            if(!version){
                cfgFile = file + '.json5';
            }else{
                cfgFile = file + '@' + version + '.json5';
            }
            const jsonData = await fs.promises.readFile(`../../interfaces/xxx/${cfgFile}`)
            markdown += `配置文件: ${cfgFile} \n`;
            markdown += '```' + 'json\n' + jsonData + '\n``` \n';  
            markdown += '*** \n'
        }else{
            // 存在多个版本的配置文件
            console.log('存在多个版本！');
            const newRemarks = []
            // 将多个版本写入Markdown
            filterRemarks.map((filterRemark) => {
                const {title,desc,file,version} = analysisRemark(filterRemark)
                let remarkObj = {
                    title,
                    desc,
                    file,
                    version
                }
                newRemarks.push(remarkObj)
            })
            // 根据版本号对注释进行降序排序（新版本号在前）
            newRemarks.sort((a,b) => {
                return shiftNumber(b.version) - shiftNumber(a.version)
            })

            // 最新版本肯定是数组的第一个
            const {title,file,desc,version} = newRemarks[0]
            // 写入Markdown文件
            markdown += `### ${index}. ${file}(${title}) \n`;
            // 描述不是必填项
            if(desc){
                markdown += `<font color="#808080">${desc}</font> \n`;
            }
            markdown +=  '```' + 'TypeScript\n' + tsData + '\n``` \n';  
            const cfgFile = file + '@' + version + '.json5';

            const jsonData = await fs.promises.readFile(`../../interfaces/xxx/${cfgFile}`)
            markdown += `配置文件: ${cfgFile} \n`;
            markdown += '```' + 'json\n' + jsonData + '\n``` \n';  

            // 去除第一个最新配置
            newRemarks.shift()
            for(let newRemark of newRemarks) {
                const {file,version} = newRemark
                // // 写入Markdown文件
                const cfgFile = file + '@' + version + '.json5';

                const jsonData = await fs.promises.readFile(`../../interfaces/xxx/${cfgFile}`)
                markdown += `配置文件（旧版）: ${cfgFile} \n`;
                markdown += '```' + 'json\n' + jsonData + '\n``` \n';  
                markdown += '*** \n';
            }
            
        }
    }
    await fs.promises.writeFile(`../../MarkDown/exportMd4.md`,markdown)
    return markdown
}
readFiles().then((markdown)=>{
    if(!markdown) return
    axios.post('https://www.yuque.com/api/v2/repos/kikigao/zaggkp',{
        title:'WebGIS配置文件',
        format:'markdown',
        body:markdown,
    },{
        headers:{
            "Content-Type":"application/json",
            "X-Auth-Token": "hIFWrCBztoN8aaFizGkrA9yq5j38w6AKMgqEUqte",
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
        }
    }).then((response) => {
        console.log('文件上传成功！');
    }).catch((err) => {
        console.log('文件上传失败！');
    })
})


// 对注释进行解析
function analysisRemark(remarkParam){
    const remark = remarkParam.split('@')
    const newRemark = []
    let title = '';
    let desc = '';
    let file = '';
    let version = '';
    remark.shift()
    remark.forEach((item)=>{
        let temp;
        temp = item.replace(/\r\n\s\D/g,"")
        newRemark.push(temp)
    })
    for(let i = 0; i < newRemark.length; i++){
        let str = newRemark[i].split(' ')[0]
        let context = newRemark[i].split(' ')[1]
        if(i === newRemark.length - 1){
            context = context.split('/')[0]
        }
        switch(str){
            case 'title':
                title = context
                break;
            case 'desc':
                desc = context
                break;
            case 'file':
                file = context
                break;
            case 'version':
                version = context
                break
        }
    } 
    return {title,desc,file,version} 
}

// 将版本号转成数字
function shiftNumber(str){
   let strArr = str.split('.')
   let numStr = ''
   for(let i = 0; i < strArr.length; i++){
    numStr += strArr[i]
   }
   return parseInt(numStr)
}
